package utp.tepc.jogogeneral;

import java.util.*;

public class Jogo /* implements IJogo */
{
    private List<JogadorDado> jogadores;
    private IGeneral general;
    private int jogadorAtual;
    private int rodada;
    private int qtLance;

    public Jogo()
    {
	this.jogadores = new ArrayList<JogadorDado>();
    }

    public JogadorDado getJogadorAtual()
    {
	return this.jogadores.get(jogadorAtual);
    }

    public void proxJogador()
    {
	this.jogadorAtual++;

	if (!(this.jogadorAtual < this.jogadores.size()))
	    this.jogadorAtual = 0;
    }
    
    public IGeneral getGeneral()
    {
	return general;
    }

    public boolean todosJogaramRodada()
    {
	boolean b = this.jogadorAtual == 0 ? true : false;
	return b;
    }

    public void proxRodada()
    {
	this.rodada++;
    }

    public boolean temLances()
    {
	if (this.general.temNovoLancamento(this.qtLance))
	    return true;

	this.qtLance = 0;

	return false;
    }
    
    public void liberarDados(JogadorDado j)
    {
	this.resetStatusDados();
	this.qtLance = 3;
	j.liberarDados();
    }

    public void jogadorLanca() throws Exception
    {
	this.jogadores.get(this.jogadorAtual).lancarDados();
	this.qtLance++;
    }

    public String getValoresLanc() throws Exception
    {
	String valores = "";

	for (Dado d : this.general.getDados())
	    valores += d.getNumeroSorteado() + " - ";

	return valores.replaceFirst("-$", "");
    }

    public void setDadosJogador() throws Exception
    {
	jogadores.get(jogadorAtual).setDados(this.general.getDados());
    }
   
    private void resetStatusDados()
    {
	for (Dado d : this.general.getDados())
	    d.setSeleciondao(false);
    }

    public void adcionarJogadorDado(JogadorDado j)
    {
	this.jogadores.add(j);
    }

    public List<JogadorDado> getJogadores()
    {
	return jogadores;
    }

    public void iniciarJogo()
    {
	this.jogadorAtual = 0;
	this.rodada = 1;
	this.general = new General(this);
    }

    public boolean fimJogo()
    {
	return this.general.temNovaRodada(this.rodada);
    }

    public int getPontuacao(Integer tipoJogada)
    {
	return general.getPontuacao(tipoJogada);
    }

    public int getRodada()
    {
	return this.rodada;
    }

    public int getQtdLance()
    {
	return this.qtLance;
    }

    public HashMap<Integer, String> jogadasPossiveis() throws Exception
    {
	HashMap<Integer, String> result = new HashMap<Integer, String>();

	int[] jogadas = general.validaJogada();

	for (int i = 0; i < jogadas.length; i++)
	    result.put((Integer) jogadas[i], general.getNomeJogada(jogadas[i]));

	return result;
    }

    public boolean isSorteado(int num) throws Exception
    {
	for (Dado d : general.getDados())
	    if (d.getNumeroSorteado().intValue() == num)
		return true;

	return false;
    }

    public boolean marcarPorDado(int num, int qtdNum, JogadorDado j) throws Exception
    {
	if (general.podeMarcarPonto(j.getPontuacao(), num))
	{
	    j.marcarPonto(new PontuacaoDado(j, num, num * qtdNum));
	    return true;
	}

	return false;
    }

    public boolean marcarPorJogada(int pontos, Integer tipoPontuacao, JogadorDado j) throws Exception
    {
	if (general.podeMarcarPonto(j.getPontuacao(), pontos))
	{
	    j.marcarPonto(new PontuacaoDado(j, tipoPontuacao, pontos));
	    return true;
	}

	return false;
    }
}
